#!/bin/bash

# Harbor 1.8 镜像迁移脚本
# 功能：从源Harbor项目拉取所有镜像，重新打标签后推送到目标Harbor，最后删除本地镜像

# 配置源Harbor信息 (v1.8)
SRC_HARBOR="10.145.216.249:30002"
SRC_PROJECT="se-ump-app"
SRC_USER="admin"
SRC_PASSWORD="Ideal123"

# 配置目标Harbor信息 (v1.8)
DST_HARBOR="hub.paas"
DST_PROJECT="se-ump-app"
DST_USER="admin"
DST_PASSWORD="Ideal123"

# 临时工作目录
WORK_DIR="./"
mkdir -p $WORK_DIR

# 检查依赖
check_dependencies() {
    if ! command -v docker &> /dev/null; then
        echo "错误: Docker 未安装"
        exit 1
    fi
    # Harbor 1.8 API不需要jq，使用grep/awk处理
}

# 登录Harbor
login_harbor() {
    echo "登录到源Harbor仓库($SRC_HARBOR)..."
    if ! docker login $SRC_HARBOR -u $SRC_USER -p $SRC_PASSWORD > /dev/null 2>&1; then
        echo "错误: 无法登录到源Harbor"
        exit 1
    fi
    
   echo "登录到目标Harbor仓库($DST_HARBOR)..."
   if ! docker login $DST_HARBOR -u $DST_USER -p $DST_PASSWORD > /dev/null 2>&1; then
       echo "错误: 无法登录到目标Harbor"
       exit 1
   fi
}

# 清理本地镜像
cleanup_image() {
    local image=$1
    echo "清理本地镜像: $image"
    docker rmi $image > /dev/null 2>&1 || echo "警告: 无法删除镜像 $image (可能已被其他镜像引用)"
}

# 获取Harbor 1.8项目中的镜像列表
get_image_list() {
    echo "获取源Harbor项目中的镜像列表..."
    curl -s -k -X GET --user "$SRC_USER:$SRC_PASSWORD" \
        "http://$SRC_HARBOR/api/repositories?project_id=$(get_project_id $SRC_PROJECT)" | grep -o '"name": "[^"]*"' | awk -F'"' '{print $4}'  | sed "s|$SRC_PROJECT/||" > $WORK_DIR/image_list.txt
}

# 获取项目ID (Harbor 1.8专用)
get_project_id() {
    local project_name=$SRC_PROJECT
    curl -s -k -X GET --user "$SRC_USER:$SRC_PASSWORD" \
        "http://$SRC_HARBOR/api/projects?page=1&page_size=15&name=$SRC_PROJECT" | grep -o '"project_id": [0-9]*' | awk '{print $2}'
}

# 获取镜像标签 (Harbor 1.8专用)
get_image_tags() {
    local image=$1
	local project_name=$SRC_PROJECT
    #curl -s -k -X GET --user "$SRC_USER:$SRC_PASSWORD" "http://$SRC_HARBOR/api/repositories/library/${image}/tags"  | grep -o '"name":"[^"]+"' | awk -F'"' '{print $4}'
    curl -s -k -X GET --user "$SRC_USER:$SRC_PASSWORD" "http://$SRC_HARBOR/api/repositories/${project_name}/${image}/tags" | grep -o '"name": "[^"]*"' | awk -F'"' '{print $4}'
}

# 主流程
main() {
    check_dependencies
    login_harbor
    get_image_list

    # 处理每个镜像
    while read IMAGE; do
        echo "处理镜像: $IMAGE"
        # 获取镜像的所有标签
        TAGS=$(get_image_tags $IMAGE)
       if [ -z "$TAGS" ]; then
            echo "警告: 镜像 $IMAGE 没有找到任何标签，跳过"
            continue
        fi
        for TAG in $TAGS; do
            echo "处理标签: $TAG"
            
            # 完整镜像地址
            SRC_IMAGE="$SRC_HARBOR/$SRC_PROJECT/$IMAGE:$TAG"
            DST_IMAGE="$DST_HARBOR/$DST_PROJECT/$IMAGE:$TAG"
            # 拉取镜像
            echo "拉取镜像: $SRC_IMAGE"
            if ! docker pull $SRC_IMAGE; then
                echo "错误: 无法拉取镜像 $SRC_IMAGE，跳过"
                continue
            fi
            
            # 重新打标签
            echo "重新打标签: $DST_IMAGE"
            docker tag $SRC_IMAGE $DST_IMAGE
            
            # 推送镜像
            echo "推送镜像到目标仓库..."
            if ! docker push $DST_IMAGE; then
                echo "错误: 无法推送镜像 $DST_IMAGE，跳过"
                cleanup_image $SRC_IMAGE
                continue
            fi
            
            # 清理本地镜像
             #cleanup_image $SRC_IMAGE
             #cleanup_image $DST_IMAGE
            echo "----------------------------------------"
        done
    done < $WORK_DIR/image_list.txt

 #   echo "所有镜像迁移完成!"
   # rm -rf $WORK_DIR
}

main


